package com.zw.mes.module.transpositionManager.service;


import com.zw.mes.common.JsonResult;
import com.zw.mes.entity.asse.HalfStore;
import com.zw.mes.entity.flow.FlowRoute;
import com.zw.mes.entity.flow.FlowSheet;
import com.zw.mes.entity.flow.FlowTrans;
import com.zw.mes.entity.shipments.AsseHalfStoreRecord;
import com.zw.mes.entity.sys.Dept;
import com.zw.mes.entity.sys.User;
import com.zw.mes.module.prodtaskmanager.service.ProdOrdService;
import com.zw.mes.module.transpositionManager.mapper.TranspositionApplyCheckMapper;
import com.zw.mes.module.transpositionManager.model.*;
import com.zw.mes.util.BeanUtil;
import com.zw.mes.util.ShiroUtils;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @className: TranspositionApplyCheckService
 * @description: 申请质检业务逻辑从
 * @author： 徐一贺 18341916590
 * @date： 2021/4/23 14:30
 * @office: 智能控制设计科
 * @research institute： 智能控制设计所
 * @department： 机械设计院
 * @company: 辽宁忠旺机械设备制造有限公司
 * @group： 忠旺集团
 * @version: 1.0
 */
@Log4j2
@Service
public class TranspositionApplyCheckService {
    @Autowired
    private TranspositionApplyCheckMapper mapper;
    @Autowired
    private ProdOrdService prodOrdService;
    /**
     * @methodName: getUserInfoByPrimaryKey
     * @description: 根据主键获取对应的用户信息 包括部门名称 科室名称
     * @param: userId
     * @return： com.zw.mes.entity.sys.User
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/23 14:34
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public User getUserInfoByPrimaryKey(Integer userId) {
        return mapper.getUserInfoByPrimaryKey(userId);
    }

    /**
     * @methodName: findApplyCheckByParam
     * @description: 获取申请质检的列表
     * @param: param
     * @return： java.util.List<com.zw.mes.module.transpositionManager.model.CheckApplyModel>
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/23 15:37
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public List<CheckApplyModel> findApplyCheckByParam(CheckApplyModel param) {
        List<CheckApplyModel> routes = new ArrayList<>();
        try {
            if (param.getQRCode() != null && !param.getQRCode().equals("")) {
                QrParse parse = getQrParse(param.getQRCode());
                if (parse == null) {
                    return null;
                } else if (parse.getCategory() != null && parse.getPartId() != null && parse.getDrawNo() != null && parse.getProNo() != null) {
                    routes = mapper.findApplyList(parse);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return routes;
    }

    /**
     * @methodName: getNewMayApplyNum
     * @description: 根据主键获取对应的可申请数量
     * @param: id
     * @return： java.lang.Integer
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/24 8:22
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public Integer getNewMayApplyNum(Integer id) {
        return mapper.getNewMayApplyNum(id);
    }

    /**
     * @methodName: getQrParse
     * @description: 解析二维码
     * @param: code
     * @return： com.zw.mes.module.transpositionManager.model.QrParse
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/23 15:59
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    private QrParse getQrParse(String code) {
        String[] arr = code.split("\\|");
        if (arr == null || arr.length < 4) {
            return null;
        }
        QrParse parse = new QrParse();
        parse.setProNo(arr[0]);
        parse.setDrawNo(arr[1]);
        parse.setPartId(arr[2]);
        parse.setCategory(arr[3]);
        return parse;
    }

    /**
     * 申请质检
     */
    @Transactional(rollbackFor = Exception.class)
    public JsonResult apply(FlowRouteModel route) {
        JsonResult jsonResult = new JsonResult();
        // 修改路线表数量 可申请数减少， 已申请数增加
        int num = mapper.updateRouteApply(route);
        if (num == 0) {
            FlowRouteModel flowRoute = mapper.getFlowRouteByPeimaryKey(route.getId());
            jsonResult.setType(JsonResult.ResultType.ERROR);
            jsonResult.setMsg("申请失败，因申请数量超过可申请数量,可申请数量为" + flowRoute.getMayApplyNum() + "个零件！");
        } else {
            // 生成转序单
            FlowTransModel trans = new FlowTransModel();
            trans.setRouteId(route.getId());
            trans.setNum(route.getApplyNum());
            User u = ShiroUtils.getUser();
            Dept dept = mapper.getDeptByPrimaryKey(u.getDeptId());
            trans.setApplyCode(u.getAccount());
            trans.setApplyName(u.getName());
            trans.setApplyTime(new Date());
            if (dept != null) {
                trans.setApplyDept(dept.getName());
            }
            trans.setIsDel(0);
            trans.setStatus(1);
            mapper.addTrans(trans);
            jsonResult.setType(JsonResult.ResultType.SUCCESS);
            jsonResult.setMsg("申请成功！");
        }
        return jsonResult;
    }

    /**
     * @methodName: findRecListByParam
     * @description: 获取转序接收列表
     * @param: param
     * @return： java.util.List<com.zw.mes.module.transpositionManager.model.TransferReceiveModel>
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/27 9:52
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public List<TransferReceiveModel> findRecListByParam(TransferReceiveModel param) {
        List<TransferReceiveModel> routes = new ArrayList<>();
        try {
            if (param.getQRCode() != null && !param.getQRCode().equals("")) {
                QrParse parse = getQrParse(param.getQRCode());
                if (parse == null) {
                    return null;
                } else if (parse.getCategory() != null && parse.getPartId() != null && parse.getDrawNo() != null && parse.getProNo() != null) {
                    routes = mapper.findRecListByParam(parse);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return routes;
    }

    /**
     * @methodName: rec
     * @description: 接收
     * @param: trans
     * @return： com.zw.mes.common.JsonResult
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/27 13:22
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    @Transactional(rollbackFor = Exception.class)
    public JsonResult rec(FlowTransModel trans) {
        JsonResult jsonResult = new JsonResult();
        Date currentDate = new Date();
        trans = mapper.getTrans(trans.getId());
        if (trans.getStatus() == 3) {
            jsonResult.setType(JsonResult.ResultType.ERROR);
            jsonResult.setMsg("已接收！无法重复接收！");
            return jsonResult;
        } else if (trans.getStatus() == 1) {
            jsonResult.setType(JsonResult.ResultType.ERROR);
            jsonResult.setMsg("未质检完成无法接收！");
            return jsonResult;
        }
        User u = ShiroUtils.getUser();
        trans.setRecCode(u.getAccount());
        trans.setRecName(u.getName());
        trans.setRecTime(currentDate);
        Dept dept = mapper.getDeptByPrimaryKey(u.getDeptId());
        if (dept != null) {
            trans.setRecDept(dept.getName());
        }
        trans.setStatus(3);
        mapper.updateRecTrans(trans);
        FlowRoute cur = mapper.findCurRoute(trans);
        //获取下一道序
        FlowRoute nextRoute = mapper.getNextRoute(cur);
        //获取零件总数
        FlowRoute totalNum = mapper.getFirstRoute(cur);
        //获取最后一道序
        FlowRoute lastRoute = getLastRoute(cur);
        //如果最后道序是铆焊则根据接收数量判断把状态进行更改，部分接收是3，完全接收是4
        if (nextRoute.getRoute().equals("参焊") && lastRoute.getRoute().equals("参焊") && lastRoute.getOrderNo().intValue() == nextRoute.getOrderNo()) {
            nextRoute.setRecNum(nextRoute.getRecNum() + trans.getNum());
            nextRoute.setMayApplyNum(0);
            if (totalNum.getRecNum().intValue() > nextRoute.getRecNum().intValue()) {
                nextRoute.setStatus(3);
            } else {
                nextRoute.setStatus(4);
            }
            mapper.updateRouteRecNum(nextRoute);
            jsonResult.setType(JsonResult.ResultType.SUCCESS);
            jsonResult.setMsg("接收成功！");
            return jsonResult;
        }
        //非最后一道序则正常进行下下一道序修改成执行中
        else {
            FlowRoute route = mapper.findNextRoute(cur);
            route.setRecNum(route.getRecNum() + trans.getNum());
            route.setMayApplyNum(route.getMayApplyNum() + trans.getNum());
            route.setStatus(2);
            mapper.updateRouteRecNum(route);
            jsonResult.setType(JsonResult.ResultType.SUCCESS);
            jsonResult.setMsg("接收成功！");
            return jsonResult;
        }
    }

    /**
     * @methodName: getLastRoute
     * @description: 获取最后一道序
     * @param: cur
     * @return： com.zw.transition.entity.FlowRoute
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/16 13:56
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    private FlowRoute getLastRoute(FlowRoute cur) {
        return mapper.getLastRoute(cur);
    }

    /**
     * @methodName: findCheckListByParam
     * @description: 获取质检列表
     * @param: param
     * @return： com.zw.mes.common.JsonResult
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/27 13:48
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public List<CheckModel> findCheckListByParam(CheckModel param) {
        List<CheckModel> routes = new ArrayList<>();
        try {
            if (param.getQRCode() != null && !param.getQRCode().equals("")) {
                QrParse parse = getQrParse(param.getQRCode());
                if (parse == null) {
                    return null;
                } else if (parse.getCategory() != null && parse.getPartId() != null && parse.getDrawNo() != null && parse.getProNo() != null) {
                    routes = mapper.findCheckList(parse);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return routes;
    }

    /**
     * @methodName: qualified
     * @description: 质检合格
     * @param: trans
     * @return： int
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/27 14:31
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    @Transactional(rollbackFor = Exception.class)
    public JsonResult qualified(FlowTransModel trans) {
        JsonResult jsonResult = new JsonResult();
        Date currentDate = new Date();
        FlowTransModel t = mapper.getTrans(trans.getId());
        if (t.getStatus() != 1) {
            jsonResult.setType(JsonResult.ResultType.ERROR);
            jsonResult.setMsg("不可重复质检！");
            return jsonResult;
        }
        User u = ShiroUtils.getUser();
        t.setCheckCode(u.getAccount());
        t.setCheckName(u.getName());
        t.setCheckTime(currentDate);
        Dept dept = mapper.getDeptByPrimaryKey(u.getDeptId());
        if (dept != null) {
            t.setCheckDept(dept.getName());
        }
        t.setYield(trans.getYield() == null ? 0 : 1);
        t.setResult(trans.getResult());
        t.setStatus(2);

        FlowRoute cur = mapper.findCurRoute(t);
        FlowRoute next = mapper.findNextRoute(cur);
        FlowSheetModel sheet = mapper.getSheet(cur);
        int totalNum = sheet.getDrawNum() - sheet.getInvalid();
        cur.setCheckNum(cur.getCheckNum() + t.getNum());
        if (totalNum == cur.getCheckNum().intValue()) {
            cur.setStatus(4);
        } else {
            cur.setStatus(3);
        }

        //获取最后一道序
        FlowRoute lastRoute = getLastRoute(cur);
        if (null != next && "转储".equals(next.getRoute())) {
            //修改倒数第二道序为已接收
            t.setStatus(3);
            //修改倒数第二道序为已接收
            next.setRecNum(next.getRecNum() + t.getNum());
            if (next.getRecNum() == totalNum) {
                next.setStatus(4);
            } else {
                next.setStatus(3);
            }
            mapper.updateRouteRecNum(next);
            next.setRouteDate(currentDate);
            mapper.updateRouteDate(next);
            //获取对应的库存信息如果没有则插入数据库，有则更新数量
            //执行入库
            HalfStore store = new HalfStore();
            store.setSheetId(sheet.getId());
            store.setNum(t.getNum());
            BeanUtil.copy(sheet, store);
            store.setStoreAddr(t.getApplyDept());
            //生成入库记录
            AsseHalfStoreRecord record = new AsseHalfStoreRecord();
            //根据 生产令编号 部分 专业 图号 获取对应的库存
            HalfStore existHalfStore = mapper.getExistHalfStore(store);
            if (existHalfStore != null) {
                existHalfStore.setNum(existHalfStore.getNum() + t.getNum());
                if (existHalfStore.getNum() <= existHalfStore.getDrawNum()) {
                    mapper.updateHalfStoreNumByPrimary(existHalfStore);
                    record.setStoreId(existHalfStore.getId());
                }else{
                    Exception exception = new Exception();
                    exception.printStackTrace();
                }
            } else {
                mapper.insertHalfStore(store);
                record.setStoreId(store.getId());
            }
            record.setProdNo(sheet.getProdNo());
            record.setSpecial(sheet.getSpecial());
            record.setPartId(sheet.getPartId());
            record.setDrawName(sheet.getDrawName());
            record.setDrawNo(sheet.getDrawNo());
            record.setDrawNum(t.getNum());
            record.setWeight(sheet.getWeight());
            record.setQuality(sheet.getQuality());
            record.setSpec(sheet.getSpec());
            record.setStoreType(1);
            record.setRecordType(1);
            record.setStoreAddr(t.getApplyDept());
            record.setStorageRegisterCode(t.getApplyCode());
            record.setStorageTime(currentDate);
            record.setCheckOpinion(t.getResult());
            mapper.insertAsseHalfStoreRecord(record);
            t.setRecordId(record.getId());
        }//如果最后道序是铆焊则根据接收数量判断把状态进行更改，部分接收是3，完全接收是4
        else if (next.getRoute().equals("参焊") && lastRoute.getRoute().equals("参焊") && lastRoute.getOrderNo() == next.getOrderNo()) {
            //修改倒数第二道序为已接收
            t.setStatus(3);
            //获取零件总数
            FlowRoute totalNumRoute = mapper.getFirstRoute(cur);
            next.setRecNum(next.getRecNum() + t.getNum());
            next.setMayApplyNum(0);
            if (totalNumRoute.getRecNum().intValue() > next.getRecNum().intValue()) {
                next.setStatus(3);
            } else {
                next.setStatus(4);

            }
            mapper.updateRouteRecNum(next);
        }
        //如果该序全部转序则修改对应任务的状态
        if (cur.getRoute().equals("铆焊") || cur.getRoute().equals("机加")) {
            int routeCount = mapper.getRoteCountBySheetId(cur.getRoute(),sheet.getProdNo());
            int routeCompleteCount = mapper.getRoteCompleteCountBySheetId(cur.getRoute(),sheet.getProdNo());
            Date start = currentDate;
            Date end = currentDate;
            if (routeCount == routeCompleteCount) {
                String tasCod = "";
                if (cur.getRoute().equals("铆焊")) {
                    tasCod = "t11";
                } else if (cur.getRoute().equals("机加")) {
                    tasCod = "t14";
                }
                mapper.updateTaskStatusAndEndDat(sheet.getProdNo(), tasCod, end, u.getDeptId(), u.getId());
            } else {
                String tasCod = "";
                if (cur.getRoute().equals("铆焊")) {
                    tasCod = "t11";
                } else if (cur.getRoute().equals("机加")) {
                    tasCod = "t14";
                }
                Date dataBaseStartDate = mapper.getDataBaseStartDate(sheet.getProdNo(), tasCod);
                if (dataBaseStartDate == null) {
                    mapper.updateTaskStatusAndStartDat(sheet.getProdNo(), tasCod, start, u.getDeptId(), u.getId());
                }
            }

        }
        mapper.updateRouteCheck(cur);
        mapper.updateCheckTrans(t);
        cur.setRouteDate(currentDate);
        mapper.updateRouteDate(cur);
        //检测改生产令全部最后一道序是否全部完成或未完成修改生产任务表的生产状态
        checkLastRouteIsFinished(sheet);
        jsonResult.setType(JsonResult.ResultType.SUCCESS);
        jsonResult.setMsg("质检合格！");
        return jsonResult;
    }
    /**
     * 检测最后一道序是否转序完毕如果转序完毕则生产任务完成，如果未完成则是执行中
     */
    @Transactional(rollbackFor = Exception.class)
    void checkLastRouteIsFinished(FlowSheetModel sheet) {
        User u = ShiroUtils.getUser();
        //获取总数量
        int totalCount = mapper.getLastRouteTotalCount(sheet);
        //获取完成总数量
        int totalFinishedCount = mapper.getLastRouteTotalFinishedCount(sheet);
        if (totalCount == totalFinishedCount) {
            mapper.updateTaskStatusAndEndDat(sheet.getProdNo(), "t27", new Date(), u.getDeptId(), u.getId());
            mapper.updateReturnEndDate(sheet.getProdNo(), "r11", new Date(), u.getDeptId(), u.getId());
            prodOrdService.udpCodStaAndDate(sheet.getProdNo(),1);
        } else {
            mapper.updateTaskStatusAndStartDat(sheet.getProdNo(), "t27", new Date(), u.getDeptId(), u.getId());
        }
    }
    /**
     * @methodName: reject
     * @description: 驳回
     * @param: trans
     * @return： com.zw.mes.common.JsonResult
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/29 14:15
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    @Transactional(rollbackFor = Exception.class)
    public JsonResult reject(FlowTransModel trans) {
        JsonResult jsonResult = new JsonResult();
        FlowTransModel t = mapper.getTrans(trans.getId());
        if (t.getStatus() != 1) {
            jsonResult.setType(JsonResult.ResultType.ERROR);
            jsonResult.setMsg("不可重复质检！");
            return jsonResult;
        }
        User u = ShiroUtils.getUser();
        t.setCheckCode(u.getAccount());
        t.setCheckName(u.getName());
        t.setCheckTime(new Date());
        Dept dept = mapper.getDeptByPrimaryKey(u.getDeptId());
        if (dept != null) {
            t.setCheckDept(dept.getName());
        }
        t.setStatus(trans.getStatus() == null ? 4 : 5);
        t.setReason((trans.getReason() == null || trans.getReason().length() < 1) ? "质检不合格" : trans.getReason());
        // 如果作废， sheet表添加作废数量
        if (t.getStatus() == 5) {
            FlowRoute cur = mapper.findCurRoute(t);
            FlowSheetModel sheet = mapper.getSheet(cur);
            sheet.setInvalid(sheet.getInvalid() + t.getNum());
            mapper.updateSheetInvalid(sheet);
        }
        mapper.updateRejectTrans(t);
        jsonResult.setType(JsonResult.ResultType.SUCCESS);
        jsonResult.setMsg("驳回申请！");
        return jsonResult;
    }

    /**
     * @methodName: findHisCheckList
     * @description: 获取历史质检列表
     * @param: param
     * @return： java.util.List<com.zw.mes.module.transpositionManager.model.FlowModel>
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/27 15:11
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public List<FlowModel> findHisCheckList(FlowModel param) {
        User user = mapper.getUserInfoByPrimaryKey(ShiroUtils.getUserId());
        param.setCheckCode(user.getAccount());
        return mapper.findHisCheckList(param);
    }

    /**
     * @methodName: cancelCheck
     * @description: 撤销质检
     * @param: trans
     * @return： com.zw.mes.common.JsonResult
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/27 16:18
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    @Transactional(rollbackFor = Exception.class)
    public JsonResult cancelCheck(FlowTransModel trans) {
        JsonResult jsonResult = new JsonResult();
        FlowTransModel t = mapper.getTrans(trans.getId());
        if (t.getStatus() == 1) {
            jsonResult.setType(JsonResult.ResultType.ERROR);
            jsonResult.setMsg("已撤销，不可重复撤销！");
            return jsonResult;
        }
        FlowRoute cur = mapper.findCurRoute(t);
        FlowSheetModel sheet = mapper.getSheet(cur);
        boolean isPass = true;
        switch (t.getStatus()) {
            // 作废
            case 5:
                sheet.setInvalid(sheet.getInvalid() - t.getNum());
                mapper.updateSheetInvalid(sheet);
                break;
            // 正常驳回
            case 4:
                break;
            // 倒数第二序
            case 3:
                FlowRoute next = mapper.findNextRoute(cur);
                if (null != next && "转储".equals(next.getRoute())) {
                    //获取对应的入库记录
                    AsseHalfStoreRecord record = mapper.getAsseHalfStoreRecordByPrimaryKey(t.getRecordId());
                    //获取对应的库存
                    HalfStore halfStore = mapper.getHalfStore(record);
                    //如果
                    if (halfStore.getNum() < record.getDrawNum()) {
                        isPass = false;
                        break;
                    } else {
                        next.setRecNum(0);
                        next.setMayApplyNum(0);
                        next.setStatus(1);
                        mapper.updateRouteRecNum(next);
                        //生成对应的退库记录
                        AsseHalfStoreRecord returnStoreRecord = record;
                        returnStoreRecord.setRecordType(2);
                        returnStoreRecord.setReplaceId(record.getId());
                        returnStoreRecord.setStorageTime(new Date());
                        mapper.insertAsseHalfStoreRecord(returnStoreRecord);
                        halfStore.setNum(halfStore.getNum() - returnStoreRecord.getDrawNum());
                        mapper.updateHalfStoreNumByPrimary(halfStore);
                        t.setRecordId(null);
                        //mapper.delHalfStore(sheet.getId());
                    }
                }else if("参焊".equals(next.getRoute())){
                    next.setRecNum(0);
                    next.setMayApplyNum(0);
                    next.setStatus(1);
                    next.setRouteDate(null);
                    mapper.updateRoute(next);
                }
                break;
            case 2: // 正常质检
                break;
        }
        if (isPass == false) {
            jsonResult.setType(JsonResult.ResultType.ERROR);
            jsonResult.setMsg("已质检的零件库存不足，无法撤销！");
            return jsonResult;
        }
        t.setCheckCode(null);
        t.setCheckName(null);
        t.setCheckTime(null);
        t.setReason(null);
        t.setResult(null);
        t.setYield(0);
        t.setStatus(1);
        t.setRecordId(null);

        cur.setCheckNum(cur.getCheckNum() - t.getNum());
        cur.setStatus(2);
//        if (cur.getCheckNum() == 9) {
//            cur.setStatus(2);
//        } else {
//            cur.setStatus(3);
//        }
        cur.setRouteDate(null);
        mapper.updateRouteCheck(cur);
        mapper.updateCheckTrans(t);
        jsonResult.setType(JsonResult.ResultType.SUCCESS);
        jsonResult.setMsg("撤销成功！");
        return jsonResult;
    }

    /**
     * @methodName: findHisApplyList
     * @description: 获取历史申请列表
     * @param: param
     * @return： java.util.List<com.zw.mes.module.transpositionManager.model.FlowModel>
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/27 16:53
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public List<FlowModel> findHisApplyList(FlowModel param) {
        User user = mapper.getUserInfoByPrimaryKey(ShiroUtils.getUserId());
        param.setApplyCode(user.getAccount());
        return mapper.findHisApplyList(param);
    }

    /**
     * @methodName: findHisRecList
     * @description: 历史接收列表
     * @param: param
     * @return： java.util.List<com.zw.mes.module.transpositionManager.model.FlowModel>
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/28 9:13
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public List<FlowModel> findHisRecList(FlowModel param) {
        User user = mapper.getUserInfoByPrimaryKey(ShiroUtils.getUserId());
        param.setRecCode(user.getAccount());
        return mapper.findHisRecList(param);
    }

    /**
     * @methodName: getTrans
     * @description: 根据主键获取转序单
     * @param: id
     * @return： com.zw.mes.module.transpositionManager.model.FlowTransModel
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/28 8:25
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public FlowTransModel getTrans(Integer id) {
        return mapper.getTrans(id);
    }

    /**
     * @methodName: getFlowRouteByPrimaryKey
     * @description: 根据主键获取路线
     * @param: routeId
     * @return： com.zw.mes.entity.flow.FlowRoute
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/28 8:26
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public FlowRoute getFlowRouteByPrimaryKey(Integer routeId) {
        return mapper.getFlowRouteByPrimaryKey(routeId);
    }

    /**
     * @methodName: cancelApply
     * @description: 取消申请质检
     * @param: trans
     * @return： int
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/28 8:27
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    @Transactional(rollbackFor = Exception.class)
    public int cancelApply(FlowTrans trans) {
        FlowTransModel flowTrans = mapper.getTrans(trans.getId());
        FlowRoute flowRoute = mapper.findCurRoute(flowTrans);
        flowRoute.setApplyNum(flowTrans.getNum());
        int res = mapper.updateRouteApplyToCancelApply(flowRoute);
        //删除转序单
        res += mapper.deleteTrans(trans);
        //如果该序是首序则修改下料状态为未下料
        if (flowRoute.getOrderNo() == 10 && !flowRoute.getRoute().equals("原料")){
            FlowSheetModel flowSheet = mapper.getSheet(flowRoute);
            flowSheet.setCutStatus(null);
            mapper.updateFlowSheetCutStatusByPrimary(flowSheet.getId());
        }
        return res;
    }

    /**
     * @methodName: repeatApply
     * @description: 重新申请质检
     * @param: trans
     * @return： com.zw.mes.common.JsonResult
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/28 8:38
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public JsonResult repeatApply(FlowTrans trans) {
        JsonResult jsonResult = new JsonResult();
        if (mapper.updateTransStatus(trans.getId(), 1) > 0) {
            jsonResult.setType(JsonResult.ResultType.SUCCESS);
            jsonResult.setMsg("重新申请成功！");
        } else {
            jsonResult.setType(JsonResult.ResultType.ERROR);
            jsonResult.setMsg("重新申请失败！");
        }
        return jsonResult;
    }

    /**
     * @methodName: delApply
     * @description: 删除申请
     * @param: trans
     * @return： com.zw.mes.common.JsonResult
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/28 8:44
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    @Transactional(rollbackFor = Exception.class)
    public JsonResult delApply(FlowTrans trans) {
        JsonResult jsonResult = new JsonResult();
        FlowTransModel transModel = mapper.getTrans(trans.getId());
        if (transModel.getIsDel() == 1) {
            jsonResult.setType(JsonResult.ResultType.ERROR);
            jsonResult.setMsg("该申请已删除！");
        } else {
            //更改删除状态
            mapper.updateTransIsdel(trans.getId(), 1);
            FlowRoute route = mapper.findCurRoute(transModel);
            route.setMayApplyNum(route.getMayApplyNum() + transModel.getNum());
            route.setApplyNum(route.getApplyNum() - transModel.getNum());
            //恢复删除数量
            //mapper.updateRouteDel(route);
            mapper.updateFlowRouteByParmaryKey(route);
            jsonResult.setType(JsonResult.ResultType.SUCCESS);
            jsonResult.setMsg("删除成功！");
        }
        return jsonResult;
    }

    /**
     * @methodName: cancelReceive
     * @description: 撤销接收
     * @param: param
     * @return： com.zw.mes.common.JsonResult
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/28 9:26
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    @Transactional(rollbackFor = Exception.class)
    public JsonResult cancelReceive(FlowModel param) {
        JsonResult jsonResult = new JsonResult();
        FlowTransModel trans = mapper.getTrans(param.getId());
        if (trans.getStatus() != 3) {
            jsonResult.setType(JsonResult.ResultType.ERROR);
            jsonResult.setMsg("该工序已被转序，无法撤销！");
        } else {
            trans.setRecCode(null);
            trans.setRecName(null);
            trans.setRecTime(null);
            trans.setStatus(2);
            mapper.updateRecTrans(trans);
            FlowRoute cur = mapper.findCurRoute(trans);
            FlowRoute route = mapper.findNextRoute(cur);
            route.setRecNum(route.getRecNum() - trans.getNum());
            route.setMayApplyNum(route.getMayApplyNum() - trans.getNum());
            if (route.getRecNum().intValue() == 0) {
                route.setStatus(1);
            }
            mapper.updateRouteRecNum(route);
            jsonResult.setType(JsonResult.ResultType.SUCCESS);
            jsonResult.setMsg("撤销成功！");
        }
        return jsonResult;
    }

    /**
     * @methodName: getCompleteCount
     * @description: 获取申请完成数量
     * @param: param
     * @return： java.lang.Integer
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/28 9:50
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public Integer getCompleteCount(CheckApplyModel param) {
        List<CheckApplyModel> routes = new ArrayList<>();
        try {
            if (param.getQRCode() != null && !param.getQRCode().equals("")) {
                QrParse parse = getQrParse(param.getQRCode());
                if (parse == null) {
                    return null;
                } else if (parse.getCategory() != null && parse.getPartId() != null && parse.getDrawNo() != null && parse.getProNo() != null) {
                    routes = mapper.findCompleteApplyList1(parse);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return routes.size();
    }

    /**
     * @methodName: getCompleteCount2
     * @description: 获取质检完成数量
     * @param: param
     * @return： java.lang.Integer
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/28 9:57
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public Integer getCompleteCount2(CheckApplyModel param) {
        List<CheckApplyModel> routes = new ArrayList<>();
        try {
            if (param.getQRCode() != null && !param.getQRCode().equals("")) {
                QrParse parse = getQrParse(param.getQRCode());
                if (parse == null) {
                    return null;
                } else if (parse.getCategory() != null && parse.getPartId() != null && parse.getDrawNo() != null && parse.getProNo() != null) {
                    routes = mapper.findCompleteApplyList2(parse);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return routes.size();
    }

    /**
     * @methodName: getCompleteCount3
     * @description: 获取接收完成数量
     * @param: param
     * @return： java.lang.Integer
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/28 10:03
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public Integer getCompleteCount3(CheckApplyModel param) {
        List<CheckApplyModel> routes = new ArrayList<>();
        try {
            if (param.getQRCode() != null && !param.getQRCode().equals("")) {
                QrParse parse = getQrParse(param.getQRCode());
                if (parse == null) {
                    return null;
                } else if (parse.getCategory() != null && parse.getPartId() != null && parse.getDrawNo() != null && parse.getProNo() != null) {
                    routes = mapper.findCompleteApplyList3(parse);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return routes.size();
    }

    /**
     * @methodName: getProjectAndProdOrdInfo
     * @description: 获取项目信息和生产令信息
     * @param: qrCode
     * @return： com.zw.mes.module.transpositionManager.model.ProjectAndProdOrdInfo
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/5/7 9:25
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public ProjectAndProdOrdInfo getProjectAndProdOrdInfo(String qrCode) {
        QrParse parse = getQrParse(qrCode);
        if (parse.getProNo() != null) {
            return mapper.getProjectAndProdOrdInfo(parse.getProNo());
        } else {
            return null;
        }
    }

    /**
     * @methodName: getRecProdNoList
     * @description: 获取接收的生产令列表
     * @param:
     * @return： java.util.List<com.zw.mes.module.transpositionManager.model.Select2Model>
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/5/11 15:24
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public List<Select2Model> getRecProdNoList(String prodNo) {
        return mapper.getRecProdNoList(prodNo);
    }

    /**
     * @methodName: getRecProdNoSpecialList
     * @description: 获取接收的类型列表
     * @param: prodNo
     * @return： java.util.List<com.zw.mes.module.transpositionManager.model.Select2Model>
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/5/12 8:54
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public List<Select2Model> getRecProdNoSpecialList(String prodNo) {
        return mapper.getRecProdNoSpecialList(prodNo);
    }

    /**
     * @methodName: getRecProdNoPartList
     * @description: 获取接收的部分列表
     * @param: prodNo
     * @param: special
     * @return： java.util.List<com.zw.mes.module.transpositionManager.model.Select2Model>
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/5/12 9:00
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public List<Select2Model> getRecProdNoPartList(String prodNo, String special) {
        return mapper.getRecProdNoPartList(prodNo, special);
    }

    /**
     * @methodName: getRecProdNoDrawNoList
     * @description: 获取接收的图号列表
     * @param: prodNo
     * @param: special
     * @param: partId
     * @return： java.util.List<com.zw.mes.module.transpositionManager.model.Select2Model>
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/5/12 9:18
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public List<Select2Model> getRecProdNoDrawNoList(String prodNo, String special, Integer partId) {
        return mapper.getRecProdNoDrawNoList(prodNo, special, partId);
    }
}
